﻿using System;
using System.Web;
using BO;
using Business;
using Entity;
using Entity.Custom;
using Newtonsoft.Json;
using Utilities;


namespace FreshCms.BackEnd.Handler
{
    /// <summary>
    /// Summary description for BlueProduct
    /// </summary>
    public class BlueProduct : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {

        #region Declare variable for check pms
        Int32 ui = 0;
        InPms chkPms = new InPms();
        InUser CurrentUser = new InUser();
        #endregion

        public void ProcessRequest(HttpContext context)
        {
            string m = "";
            var response = new ResponseData();

            #region Get PanelId and Check Psm
            CurrentUser = InUserBusiness.GetSessionInUser();
            if (!string.IsNullOrEmpty(context.Request["ui"]))
            {
                Int32.TryParse(context.Request["ui"], out ui);
                if (ui > 0)
                    chkPms = InPmsBusiness.CheckSessionPms(ui);
                if (chkPms == null)
                    chkPms = new InPms { PmsView = 0, PmsUpdate = 0, PmsDelete = 0 };
            }
            #endregion



            if (context.Request.RequestType == "POST")
            {
                if (context.Request["m"] != null)
                    m = context.Request["m"];
                else
                    return;
            }
            else
            {
                if (context.Request.QueryString["m"] != null)
                    m = context.Request.QueryString["m"];
                else
                    return;
            }

            switch (m.ToLower())
            {
                case "add":
                    response = AddProduct(context);
                    break;
                case "delete":
                    response = DeleteProduct(context);
                    break;
            }

            context.Response.ContentType = "application/x-javascript";

            string callBack = context.Request["callback"];
            if (!string.IsNullOrEmpty(callBack))
                context.Response.Write(callBack + "( " + JsonConvert.SerializeObject(response) + " );");
            else
                context.Response.Write(JsonConvert.SerializeObject(response));
        }

        private ResponseData AddProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["name"])
                && !string.IsNullOrEmpty(context.Request["quantity"])
                && !string.IsNullOrEmpty(context.Request["price"])
                && !string.IsNullOrEmpty(context.Request["desc"]))
            {
                string name, desc = "";
                long price = 0;
                Int32 quantity = 0;
                Int32 id = 0;

                name = context.Request["name"];
                Int32.TryParse(context.Request["quantity"], out quantity);
                long.TryParse(context.Request["price"], out price);
                desc = context.Request["desc"];

                if (!string.IsNullOrEmpty(context.Request["id"]))
                    Int32.TryParse(context.Request["id"], out id);

                var obj = new Entity.BlueProduct()
                {
                    ProId = id,
                    ProName = name,
                    ProDesc = desc,
                    ProNote = "",
                    ProPrice = price,
                    ProTotalQuantity = quantity
                };

                // ID>0 là UPDATE
                if (id > 0)
                {
                    #region UPDATE sản phẩm

                    var returnVal = BlueProductBusiness.UpdateBlueProduct(obj);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call UPDATE OK";

                        // Ghi log hệ thống
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 2,
                            Field1 = "Update thông tin sản phẩm thành công",
                            Field2 = "Sản phẩm thay đổi thông tin: " + name + " (ID: " + id + ")",
                            Field3 = "",
                            LogId = 0
                        });

                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "UPDATE ERROR";
                        response.Success = false;
                    }
                    #endregion
                }
                else // INSERT sản phẩm
                {
                    #region INSERT sản phẩm
                    var idProReturn = BlueProductBusiness.InsertBlueProduct(obj);

                    if (idProReturn > 0) // Nếu Insert thành công thì Insert bảng ListOn
                    {
                        response.Data = idProReturn;
                        response.Message = "Call Insert OK";
                        response.Success = true;

                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 1,
                            Field1 = "Thêm sản phẩm thành công",
                            Field2 = "Tên sản phẩm mới: " + name,
                            Field3 = "",
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = idProReturn;
                        response.Message = "Call Insert ERROR";
                        response.Success = false;
                    }
                    
                    #endregion
                }

            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData UpdateFastProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsUpdate == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoUpdate, Success = false };

            var response = new ResponseData();

            if (!string.IsNullOrEmpty(context.Request["id"])
                && !string.IsNullOrEmpty(context.Request["name"])
                && !string.IsNullOrEmpty(context.Request["quantity"])
                && !string.IsNullOrEmpty(context.Request["price"])
                && !string.IsNullOrEmpty(context.Request["desc"]))
            {
                string name, code = "";
                double newprice = 0;
                Int32 stt = 0;
                Int32 id = 0;

                name = context.Request["name"];
                code = context.Request["code"];
                double.TryParse(context.Request["price"], out newprice);
                Int32.TryParse(context.Request["id"], out id);
                Int32.TryParse(context.Request["stt"], out stt);

                var obj = new OutProduct()
                {
                    ProId = id,
                    ProName = name,
                    ProCode = code,
                    ProNewPrice = newprice,
                    ProStatus = stt,
                    UserId = CurrentUser.UserId
                };

                // ID>0 là UPDATE
                if (id > 0)
                {
                    #region UPDATE sản phẩm

                    Int32 returnVal = -1;
                    // Check neu User la SuperAdmin ( quyền sửa tất cả ) thì cho UPDATE luôn, không cần check UserID
                    if (CurrentUser.IsSuperAdmin == 1)
                        returnVal = OutProductBusiness.UpdateOutProduct_Fast(obj);
                    else
                        returnVal = OutProductBusiness.UpdateOutProductWithRole_Fast(obj);
                    // UPDATE thanh cong
                    if (returnVal > 0)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call FAST Update OK";

                        // Ghi log hệ thống
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 2,
                            Field1 = "Update nhanh thông tin sản phẩm thành công",
                            Field2 = "Sản phẩm thay đổi thông tin: " + name + " (ID: " + id + ")",
                            Field3 = "Giá mới: " + newprice.ToString(),
                            LogId = 0
                        });

                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Sản phẩm này không do bạn tạo ra. Bạn không có quyền chỉnh sửa sản phẩm này.";
                        response.Success = false;
                    }
                    #endregion
                }
                else
                {
                    response.Data = id;
                    response.Message = "ProductID <=0";
                    response.Success = false;
                }

            }
            else
            {
                response.Data = -1;
                response.Message = "Param Name, Status not valid";
                response.Success = false;
            }

            return response;
        }

        private ResponseData DeleteProduct(HttpContext context)
        {
            // Check Pms
            if (chkPms.PmsDelete == 0)
                return new ResponseData { Data = null, ExtData = null, Message = Constant.PmsNoDelete, Success = false };

            var response = new ResponseData();
            if (!string.IsNullOrEmpty(context.Request["id"]))
            {
                var id = 0;
                Int32.TryParse(context.Request["id"], out id);
                string name = context.Request["name"];
                if (id > 0)
                {
                    var returnVal = BlueProductBusiness.DeleteBlueProduct(id);
                    // UPDATE thanh cong
                    if (returnVal > -1)
                    {
                        response.Data = returnVal;
                        response.Success = true;
                        response.Message = "Call Delete OK";
                        // log system 
                        InLogBusiness.InsertInLog(new InLog
                        {
                            UserId = CurrentUser.UserId,
                            LogAction = 0,
                            Field1 = "Xóa vĩnh viễn sản phẩm thành công",
                            Field2 = "Tên sản phẩm: " + name,
                            Field3 = "ID: " + id,
                            LogId = 0
                        });
                    }
                    else
                    {
                        response.Data = returnVal;
                        response.Message = "Xóa bị lỗi";
                        response.Success = false;
                    }
                }
                else
                {
                    response.Data = id;
                    response.Message = "id <=0";
                    response.Success = false;
                }
            }
            else
            {
                response.Data = -1;
                response.Message = "Param not valid";
                response.Success = false;
            }
            return response;
        }

        
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}